import OfflineData from '/common/offline-data-cache.js'
import checkUpdate from '@/uni_modules/uni-upgrade-center-app/utils/check-update'
import mqtt from 'mqtt/dist/mqtt.js';
/***
 * 浏览器环境
 * 使用协议为 ws 和 wss 的 MQTT over WebSocket 连接
 * EMQX 的 ws 连接默认端口为 8083，wss 为 8084
 * 注意需要在连接地址后加上一个 path, 例如 /mqtt
 */
// #ifdef H5
const url = 'ws://emqx.bihuoa.cn:8083/mqtt'
// #endif
/***
 * Node.js 环境
 * 使用协议为 mqtt 和 mqtts 的 MQTT over TCP 连接
 * EMQX 的 mqtt 连接默认端口为 1883，mqtts 为 8084
 */
// #ifndef H5
const url = 'wx://emqx.bihuoa.cn:8083/mqtt'
// #endif
export const connect = () => {
	const savedScreenId = uni.getStorageSync('screenId');
	// 创建客户端实例
	const options = {
		// Clean session
		clean: true,
		connectTimeout: 4000,
		reconnectPeriod: 10000,
		// 认证信息
		clientId: 'screen-' + savedScreenId,
		username: 'zhihuiyizhan',
		password: 'zhihuiyizhan123'
	}
	const client = mqtt.connect(url, options)
	client.on('reconnect', () => {
		console.log('Reconnecting...')
	})
	client.on('error', function(error) {
		console.log(error)
	})
	client.on('connect', function() {
		console.log('Connected')
		uni.showToast({
			title:'MQTT已连接'
		})
		// 订阅主题
		client.subscribe(['ym/command'], function(err) {
			if (!err) {
				// 发布消息
				client.publish('ym/screen', JSON.stringify({
						screenId: savedScreenId,
						status: 'online',
						msg: '上线了'
					}), {
						qos: 0,
						retain: false
					},
					(e) => {
						console.log(e)
					}
				)
			}
		})
	})
	// 接收消息
	client.on('message', function(topic, payload) {
		// message is Buffer
		console.log(topic, payload.toString())
		if (topic === 'ym/command') {
			try {
				// {command:'', params: {}}
				const msg = JSON.parse(payload)
				execCommand(msg.command, msg.params)
			} catch (e) {
				console.error(e)
			}
		}
	})


	return client;

}

// 根据不同命令执行不同的方法
const execCommand = async (command, params) => {
	switch (command) {
		case 'restart':
			// 重启
			console.log('重启')
			plus.runtime.restart();
			return;
		case 'updateOfflineData':
			// 更新离线数据
			console.log('更新离线数据')
			const savedScreenId = uni.getStorageSync('screenId');
			await OfflineData.updateOfflineData(savedScreenId)
			// 页面重载
			const pages = getCurrentPages()
			// 声明一个pages使用getCurrentPages方法
			const curPage = pages[pages.length - 1]
			uni.redirectTo({
				url: '/' + curPage.route
			})
			break;
		case 'clearCache':
			// 清除除了ID外的所有缓存
			const storage = uni.getStorageInfoSync();
			console.log(storage);
			storage.keys.forEach(key => {
				if (key !== 'screenId') {
					uni.removeStorageSync(key);
				}
			})
			uni.redirectTo({
				url: '/pages/Login/Login'
			})
			break;
		case 'clearAllCache':
			// 清除所有缓存
			uni.clearStorageSync();
			uni.redirectTo({
				url: '/pages/Login/Login'
			})
			break;
		case 'updateApp':
			// 更新版本
			await checkUpdate();
			break;

	}
}